# 导入蓝图对象
from flask import g

from info.utils.common import user_login_data
from . import index_blu

from info.utils.response_code import RET
from flask import request, jsonify
from flask import session

from info import constants
from info.models import User, News, Category
from flask import render_template
# 导入redis数据库对象
from info import redis_store
# 导入应用上下文变量
from flask import current_app


# 用蓝图装饰视图函数
@index_blu.route('/')
@user_login_data
def index():
    """
    渲染主页面视图函数
    :return:
    """
    # 获取用户信息
    user = g.user

    # --------------------------不同功能分割线------------------------------------------

    # 页面右边的点击排行
    news_list = list()
    try:
        # 查询点击排行数据,新闻数据在 News 表格中
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)

    click_news_list = list()  #
    for news in news_list if news_list else list():  # 三元表达式
        click_news_list.append(news.to_basic_dict())  # news为数据对象,to_basic_dict为数据中的一个表单是字典格式

    # --------------------------不同功能分割线------------------------------------------

    # 获得新闻分类数据,Category 为新闻分类表单
    categories = Category.query.all()

    categories_dicts = list()
    for category in categories:
        categories_dicts.append(category.to_dict())

    # --------------------------不同功能分割线------------------------------------------

    data = {
        'user_info': user.to_dict() if user else None,  # 三元表达式,user为True执行前面代码,False执行后面
        'click_news_list': click_news_list,
        'categories_dicts': categories_dicts
    }

    return render_template('news/index.html', data=data)


@index_blu.route('/favicon.ico')
def favicom():
    """
    网页图标标示视图函数
    :return:
    """

    return current_app.send_static_file('news/favicon.ico')  # send_static_file 为寻找静态文件函数


@index_blu.route('/news_list')
def news_list():
    """
    网页信息分类视图函数
    :return:
    """

    # 获取参数,前端传递数据的方式为GET,我们用取参数的方法取值
    args_dict = request.args
    cid = args_dict.get('cid', '1')
    page = args_dict.get('page', '1')
    per_page = args_dict.get('per_page', constants.HOME_PAGE_MAX_NEWS)

    # 校验参数是否符合规范
    try:
        cid = int(cid)  # 分类
        page = int(page)  # 页数
        per_page = int(per_page)  # 显示条数
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.NODATA, errmsg='参数错误')

    filters = [News.status == 0]  # 用来保存查询条件变量
    # 默认分类为新闻,cid为1 所以不用查询
    if cid != 1:
        filters.append(News.category_id == cid)

    try:
        # 数据库查询 *filters为拆包,create_time为创将时间,paginate为分页方法,page为当前页数,per_page为一页显示个数数
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)

        items = paginate.items  # 查询数据
        total_page = paginate.pages  # 总页数
        current_page = paginate.page  # 当前页数
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='数据库查询错误')

    news_li = list()  # 存放元素为字典
    for news in items:
        news_li.append(news.to_basic_dict())

    data = {
        'cid': cid,
        'total_page': total_page,
        'current_page': current_page,
        'news_li': news_li
    }

    return jsonify(errno=RET.OK, errmsg="OK", data=data)